#ifndef __PROTOCAL_OCID_H__
#define __PROTOCAL_OCID_H__

#include <fpga-common.h>

/** @defgroup fpga_ocid
 * @{
 */

struct fpga_ocid_test_param
{
    int ch;
    int post;       // 位置（由FPGA自己决定起始、结束位置）
    int post_from;  // 起始位置（由ARM处理器决定两位置）
    int post_to;    // 结束位置（由ARM处理器决定两位置）

    int sensitive;  // FPGA对数据的灵敏度（或者成为电压值、音量值）
                    // TODO
};

#define IO_OCID_SENSITIVE  (0x1)
#define IO_OCID_PARAM      (0x2)
#define IO_OCID_ALARM_BASE (0x100)


// struct fpga_test_param
// {
// 	/*!<
// 		OTDR 测试参数描述，与硬件无关

// 		   <      1 / laser_freq   >
// 		   <  pulse >
// 		    --------                 --------
// 		   |        |               |        |
// 		   |        |               |        |
// 		   |        |               |        |
// 		---|        |---------------|        |------------

// 		    ^ ^ ^ ^ ^ ^ ^ ^          ^ ^ ^ ^ ^ ^ ^ ^
// 		    | | | | | | | |          | | | | | | | |
// 			   /   \
// 			  /     \
// 			/         \
// 		      /             \
// 		     <1 / sample_freq>
// 	*/
// 	bool          en_hw_dist;
// 	unsigned long dist;  /// 测试量程单位米，该字段内容决定采用什么采样率
// 						 /// fpga_test_param.sample_freq

// 	unsigned short laser_freq;  ///< 激光器脉冲频率选择
// 	bool           en_hw_pulse;
// 	unsigned short pulse; /*!< 脉冲宽度，单位ns*/


// 	unsigned short sample_freq;  ///< 采样频率选择，单位hz

// 	bool           en_hw_adopt_pt;
// 	unsigned long  adopt_pt;  ///< 采样点数，单位个
// 	bool           en_hw_add_cnt;
// 	unsigned short add_cnt;  ///< 累加次数，单位次
// 	bool           en_hw_add_ms;
// 	unsigned short add_ms;  ///< 累加时间，单位ms

// 	unsigned long amp; /*!< 使能放大： 1：使能放大开关，与具体放大倍数无关.
// 			   但必须保证，各放大开关打开之后效果必定比前一个大\n

// 			   运放级别分成3级，对应24bit \n
// 			    00000000 00000000 00000000 00000000\n
// 			   |..........................|=======| ----  1级放大\n
// 			   |.................|=======|......... ----  2级放大\n
// 			   |........|=======|.................. ----  3级放大\n
// 			   |=======|...........................  ----  预留\n
// 			    例子:\n\n
// 			    00000000 00000000 00000011 00000001\n --->
// 			   使能1级放大开关S1-1，使能2级放大S2-1、S2-2
// 			   */
// 	bool          en_hw_amp;
// 	char          hw_amp;

// 	char apd_vol; /*!< APD电压，数值越高电压越高，@ref APD电压范围
// 		      OTDR_APD_LOW~OTDR_APD_HIGH
// 		      */
// 	bool en_hw_apd_vol;
// 	char hw_apd_vol;

// 	char power; /*!< 激光器功率，数值越高功率越高，@ref 光功率控制
// 		    OTDR_LASER_PW_LOW ~ OTDR_LASER_PW_HIGH
// 		    */

// 	char isrun;  ///< 是否启动


// 	short laser_ch; /*!< 激光器通道，从1开始计数，
// 			同时 “可能选择性” 支持以波长（单位nm）方式指定通道，
// 			如：1310、1550、1625。\n
// 			1 通道对应 1310nm 激光器\n
// 			2 通道对应 1550nm 激光器\n
// 			具体对应关系与接口实现有关
// 			*/
// 	char  panel_ch; /*!< 面板光口通道，从 1 开始计数
// 			可能由光开关控制，同一面板通道可能不同时刻用于不同激光器通道
// 			*/
// #if defined(CONFIG_EN_CAP)
// 	unsigned long cap;        //  电容等级，描述值
// 	bool          en_hw_cap;  //  使能硬件编码
// 	char          hw_cap;     //  硬件编码
// #endif
// };
/*
公共函数，不应该白直接调用，统统放入 struct fpga_if
struct fpga_if xx;
fpga_if_register(&xx);
*/

extern int cb_fpga_ocid_probe(struct fpga_dev *dev);
extern int cb_fpga_ocid_release(struct fpga_dev *dev);
extern int cp_fpga_ocid_start(struct fpga_dev *dev);
extern int cp_fpga_ocid_stop(struct fpga_dev *dev);
extern int cp_fpga_ocid_sensitive(struct fpga_dev *dev, int sensitive);
// cp_ocid_set_gpio代替cp_fpga_ocid_sensitive
extern int cp_ocid_set_gpio(struct fpga_dev *dev, int io, int val);
extern int cp_fpga_ocid_param(struct fpga_dev *dev, struct fpga_ocid_test_param *val);
extern int cp_fpga_read_ocid_data(
	struct fpga_dev *dev,
	unsigned char   *ocid_data,
	unsigned long    len,
	unsigned long   *rlen);
extern int cb_fpga_alarm(struct fpga_dev *dev, int ch, int is_appear);


#endif
